package com.bwhx.eruler.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Map;
import java.util.UUID;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class RequestUtil {
	private RequestUtil(){};
	
	public static Log log = LogFactory.getLog(RequestUtil.class);

	public static String getTrace(Throwable t){
		
		StringWriter stringWriter= new StringWriter();
		PrintWriter writer= new PrintWriter(stringWriter);
		t.printStackTrace(writer);
		StringBuffer buffer= stringWriter.getBuffer();
		return buffer.toString();
	}
	public static String inputWith(InputStream in){
		 //这里接受到客户端传过来的数据 是json字符类型
		 BufferedReader reader = new BufferedReader(new InputStreamReader(in));
	     StringBuilder sb = new StringBuilder();
	     String line;
	     try {
			while((line=reader.readLine())!=null){
			     sb.append(line);
			 }
			
			if (sb.toString() == null ||sb.toString().equals("")) {
				return null;
			}
			else{
				return sb.toString();

			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			log.error(getTrace(e));
		}
	     
	     
	     return null;
		
	}

	
	/**
     * 验证一个字符串是否是合法的JSON串
     * 
     * @param input 要验证的字符串
     * @return true-合法 ，false-非法
     */
  
	
	  /**
     * 获取系统流水号
     * @see 若欲指定返回值的长度or是否全由数字组成等,you can call {@link TradePortalUtil#getSysJournalNo(int, boolean)}
     * @return 长度为20的全数字
     */
	
    public static String getSysJournalNo(){
        return getSysJournalNo(20, true);
    }
	
	
    /**
     * 获取系统流水号
     * @param length   指定流水号长度
     * @param toNumber 指定流水号是否全由数字组成
     */
    public static String getSysJournalNo(int length, boolean isNumber){
        //replaceAll()之后返回的是一个由十六进制形式组成的且长度为32的字符串
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        if(uuid.length() > length){
            uuid = uuid.substring(0, length);
            
            String fisrtString = uuid.substring(0, 1);
            if (fisrtString.equals("0")) {
				uuid.regionMatches(0, "1", 1, 1);
			}
            
//            String lastString = uuid.substring(length-1, 1);
//            if (lastString.equals("0")) {
//				uuid.regionMatches(length-1, "1", length, 1);
//			}
            
            
        }else if(uuid.length() < length){
            for(int i=0; i<length-uuid.length(); i++){
                uuid = uuid + Math.round(Math.random()*9);
            }
   
        }
        if(isNumber){
            return uuid.replaceAll("a", "1").replaceAll("b", "2").replaceAll("c", "3").replaceAll("d", "4").replaceAll("e", "5").replaceAll("f", "6");
        }else{
            return uuid;
        }
    }
    
    /**
     * 判断输入的字符串参数是否为空
     * @return boolean 空则返回true,非空则flase
     */
    public static boolean isEmpty(String input) {
        return null==input || 0==input.length() || 0==input.replaceAll("\\s", "").length();
    }
    
    /**
     * 判断输入的字节数组是否为空
     * @return boolean 空则返回true,非空则flase
     */
    public static boolean isEmpty(byte[] bytes){
        return null==bytes || 0==bytes.length;
    }
    

	/** 
	* 检查 email输入是否正确 
	* 正确的书写格 式为 username@domain 
	* @param value 
	* @return 
	*/ 
	public static boolean checkEmail(String value) { 
	return value.matches("[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"); 
	} 

	/** 
	* 检查电话输入 是否正确 
	* 正确格 式 012-87654321、0123-87654321、0123－7654321 
	* @param value 
	* @return 
	*/ 
	public static boolean checkTel(String value) { 
	return value.matches("\\d{4}-\\d{8}|\\d{4}-\\d{7}|\\d(3)-\\d(8)"); 
	} 
	
	/** 
	* 检查手机输入 是否正确 
	* 
	* @param value 
	* @return 
	*/ 
	public static boolean checkMobile(String value) { 
	return value.matches("^[1][3,5]+\\d{9}"); 
	} 
	
	/** 
	* 检查中文名输 入是否正确 
	* 
	* @param value 
	* @return 
	*/ 
	public static boolean checkChineseName(String value, int length) { 
	return value.matches("^[\u4e00-\u9fa5]+$")&&value.length()<=length; 
	} 
	/** 
	* 检查HTML 中首尾空行或空格 
	* @param value 
	* @return 
	*/ 
	public static boolean checkBlank(String value){ 
	return value.matches("^\\s*|\\s*$"); 
	} 
	/** 
	* 检查字符串是 否含有HTML标签 
	* @param value 
	* @return 
	*/ 
	
	public static boolean checkHtmlTag(String value){ 
	return value.matches("<(\\S*?)[^>]*>.*?</\\1>|<.*? />"); 
	} 
	/** 
	* 检查URL是 否合法 
	* @param value 
	* @return 
	*/ 
	public static  boolean checkURL(String value){ 
	return value.matches("[a-zA-z]+://[^\\s]*"); 
	} 
	/** 
	* 检查IP是否 合法 
	* @param value 
	* @return 
	*/ 
	public static boolean checkIP(String value){ 
	return value.matches("\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}+\\.\\d{1,3}"); 
	} 
	/** 
	* 检查ID是否 合法，开头必须是大小写字母，其他位可以有大小写字符、数字、下划线 
	* @param value 
	* @return 
	*/ 
	public static boolean checkID(String value){ 
	return value.matches("[a-zA-Z][a-zA-Z0-9_]{4,15}$"); 
	} 
	/** 
	* 检查QQ是否 合法，必须是数字，且首位不能为0，最长15位 
	* @param value 
	* @return 
	*/ 
	
	public static boolean checkQQ(String value){ 
	return value.matches("[1-9][0-9]{4,13}"); 
	} 
	/** 
	* 检查邮编是否 合法 
	* @param value 
	* @return 
	*/ 
	public static boolean checkPostCode(String value){ 
	return value.matches("[1-9]\\d{5}(?!\\d)"); 
	} 
	/** 
	* 检查身份证是 否合法,15位或18位 
	* @param value 
	* @return 
	*/ 
	public static boolean checkIDCard(String value){ 
	return value.matches("\\d{15}|\\d{18}"); 
	} 
	/** 
	* 检查输入是否 超出规定长度 
	* @param length 
	* @param value 
	* @return 
	*/ 
	public static boolean checkLength(String value, int length) { 
	return ((value == null || "".equals(value.trim())) ? 0 : value.length()) <= length; 
	} 
	
	/** 
	* 检查是否为空 字符串,空：true,不空:false 
	* 
	* @param value 
	* @return 
	*/ 
	public static boolean checkNull(String value){ 
	return value == null || "".equals(value.trim()); 
	} 
	
}
